function addEventListener(el,type,fn,selector){
    //判断el的类型
    if(typeof el==='string')
    {
        el=document.querySelector(el)  //获取他的事件源
    }
    //事件绑定
    //若没有传递子元素的选择器 ，则给el元素绑定事件
    if(!selector){
        el.addEventListener(type,fn)
    }
    else
    {
        el.addEventListener(type,function(e){
            //获取点击的目标事件源
            const target=e.target;
            //判断选择器与目标元素是否相符合
            if(target.matches(selector)){  //判断点击的是不是selector 是返回真 不是返回假
                //若符合 则调用回调
                fn.call(target,e);  //用这个回调执行 这样this执行就是事件源自己了
            }  
        })
    }
}